import { onConnect, onbindAccount } from './cim.web.sdk.js'

// 已读回执api
// import { readed, readedGroup } from '@/api/message'

// import store from '../store'
// import { replyMsg } from '@/utils/replyMsg'
// import { msgCallback } from '@/utils/msgCallback'
// import checkSymbol from '@/utils/checkSymbol.js'
// import localforage from 'localforage'
// import bus from "@/plugins/bus"; // bus 事件总站广播

// import utils from "IM/utils/utils";

// import _ from 'lodash'

// localforage.config({
//   name: 'hoxin'
// })


// 通知外部window 来新消息了
const targetWindow = window.top;
// 接受服务端的实时消息推送，也就是服务端推的消息部分
const onLogout = _.debounce(() => {
  // ElMessageBox.alert('账号异地登录', '登录提示', {
  //   confirmButtonText: '确定',
  //   type: 'warning',
  //   callback: () => {
  //     store.dispatch('user/logout').then(() => {
  //       router.push('/login')
  //       window.stopConnect()
  //     })
  //   }
  // })
   console.log('发送退出命令');
   // 父级别退出登录
    targetWindow.postMessage({action: 'loginOut'}, '*') 
}, 2000)



// 做了 4 个事情 
// 1 连接   2 onbindAccount 绑定账号，这里才算账号绑定成功
// 3 上线响应
// 4 核心， 每次来了新消息

export function webSocket( option ) {
  
    // 建立ws 连接
    onConnect()
 
  const onConnectFinished = () => {
    console.log(`用户userId ${option.id} 与ws账号绑定成功`);
    onbindAccount( option.userId )

  }
  window.onConnectFinished = onConnectFinished

  const onReplyReceived = reply => {
    // 上线响应
    // console.log(reply);
    if (reply.key === 'client_bind' && reply.code === '200') {
      console.log("上线响应");
    }
  }
  const fz = []
  
  window.onReplyReceived = onReplyReceived
  // 全局的消息接受，在window 上进行事件监听
  const onMessageReceived = async message => {


    console.log('ws收到的消息', message);
    return;
    // 检测 是否有@我
    const isT = checkSymbol(message.content)
    // console.log("有人@我", isT);
    // sender 发送者（群聊中位群组的id）， 群聊消息action 为3， extra 群聊中位发送者的id 
    const { sender, extra, action } = message
    if (isT) {
      store.commit('user/SET_SYMBOL', {
        sender,
        extra,
        action,
        isT,
        isClick: false
      })
    }
    //  接受到信息之后， 需要将这个信息通过接口告诉后端已经接受了, 在线接收消息回执 否则为离线消息
    // if (message.action < 900) {
    //   await received(message.id, message.action)
    // }
    let replyList = store.getters.replyList;
    // 从replyList 中找是否已经存在这条会话
    let reply, replyIndex, replyCompare;
    

    // 接受到的是单聊消息， 如果sender是自己则是同步，那么message.receiver 就是我会话的sourceId , 如果不是自己，则是对方发来的，message.sender 就是我的会话Id
    // format 是8  是待办任务
    if(message.action == '0'){
      replyCompare =  message.sender == store.state.user.id  ? message.receiver : message.sender;

    }else if(message.action == '3'){
      replyCompare = message.sender; // 群聊中 ws 接收到的message.sender 是群的sourceId  
    }else  if (message.action == '100'){
      replyCompare = message.sender;
    }else  if (message.action == '101'){  // 撤回
      replyCompare = message.sender == store.state.user.id  ? message.receiver : message.sender;
   
    }else{
      replyCompare = message.sender;
    }
    replyList.forEach((item,idx)=> {
      // 根据id判断有没有存储对应的聊天记录
      if (item.sourceId == replyCompare) {
        reply = item
        replyIndex = idx
      }
    })

    // 服务端可以自动退出登录，ws  的action 为999
    if (message.action == '999') {
      onLogout()
      return false
    }
    
    
    // 除了单聊消息和群聊消息系统消息的处理, 各种消息类型的处理， 不需要经过replyMsg 处理的消息类型
    // 313 设置管理员  314 取消管理员 315 群公告  304 修改群名称
    // message.action 的处理统一放到了这里  100 消息被阅读 101 消息被撤回   307 群主管理员转让
    // 311 是有新成员加入群
    let notMsgCb =  ['313', '314', '315', '307'];
    if (message.action > 4 && !notMsgCb.includes(message.action)) {
      return  msgCallback(message, reply, replyIndex);
    }
     
    // 单聊消息和群聊消息系统消息的处理
    // 注意这个只是一个会话， 会话下面有很多的消息
    // 将此条消息合并到会话reply 的消息列表中去， 注意判断reply 不存在的情况
    const replyMsgs = replyMsg(reply, message);
 
    // 特殊的消息 待办任务消息 并且是全新的
    if(message.format == '8' && message.isNew){
      targetWindow.postMessage({action: 'websiteTip', payload: message.content}, '*');
    }

    // 当前会话打开区域， 正好是发来的信息对象会话
    // 如果是，需要实时更新chatList, 如果不是则需要在当前的reply 未读newmsgcount 数量加1
    
    if(store.state.currentChatId == replyMsgs.sourceId){
      // console.log('判断当前是打开状态还是关闭状态', window.IMVisible)
      if(!store.state.visible){
        replyMsgs.newmsgcount += 1; 
      }else{
        replyMsgs.newmsgcount = 0; // 未读消息置空
        // 如果是单聊
        if(reply.type == 'user'){
          readed(message.id, message.sender)
        }
        // 群聊
        if(reply.type == 'group'){
          let param  = {groupId:reply.sourceId,  messageId: message.id };
          readedGroup(param)
        }

      } 
    }else{
      // 不是当前的会话， 不能在msgList 内部添加message , 因为会触发多次渲染， 导致滚动条无法正确渲染完成之后股东到底部
      replyMsgs.newmsgcount += 1;
      replyMsgs.msgList.pop(); // 将最新的消息给去除
    }
    
 
    // 只有单聊或者群聊操作，实时更新reply 上的messageId 和 message 内容
    // 实时更新replyMsgs 上的一些数据
    let msgAction = String(message.action);
    if(["0", "3"].includes( msgAction )){
      replyMsgs.message = message.content;
      replyMsgs.messageId = message.id;
      replyMsgs.timestamp = message.timestamp || new Date().getTime(); 
    }

    // 修改根目录下的replyList, commit 只单独设置replayList, 而action 会有一些副作用，一些数据联动
    // 接受到消息，只将消息添加到当前的会话中去即可，同时调整reply 的顺序
    // 会话列表存在不存在，然后新会话的排序情况
    // 异步获取详细信信息 --- 会话列表列表级别
    await utils.getReplyExtraInfo( replyMsgs );  // 需要得到额外的信息，写成同步
    // 判断有没有at 功能，有人@ 我判断标志
    let hasAtme = false;
    if(message.title && message.title.at){
       let atIds = message.title.at.map(item=>{
            return  item.split("@")[0]
       });
       // @ 的人中有 群Id 或者我自己的Id 
       let hasGroupOrMe = atIds.find(id => (id == replyMsgs.sourceId || id == store.state.user.id));
       if(hasGroupOrMe){
        hasAtme = true;
       }
    }


    // 排序一下
    replyList = utils.serachAndCreateReply(replyMsgs, replyList);
    store.commit("setReplyList", replyList);

    // 计算当前会话的未读消息总数
    const unreadTotal =  utils.calcTotalUnread(replyList);
    targetWindow.postMessage({action: 'newmsg',payload: unreadTotal}, '*');

    // 如果是当前会话, 需要判断是否滚动条位置， 滚动条在一屏之内， 就自动加载最新消息， 否则不自动加载
    if(store.state.currentChatId == replyMsgs.sourceId){
      bus.$emit("scrollToBottom");   // 发送这个的时候，其实这条新消息已经渲染好了
      // 其实现在这条消息已经被渲染好了，这个是无用的保证
      store.commit("setChatList", [ ...replyMsgs.msgList ]);

    
    }else{
       if(hasAtme){
         replyMsgs.isCall = true
       }
    }
    
  }

  window.onMessageReceived = onMessageReceived
}
